package liming.ai.code.v3.core;

import liming.ai.code.v3.data.Context;
import liming.ai.code.v3.data.FileInfo;
import liming.ai.client.impl.deepseek.DeepSeekClient;
import liming.ai.data.deepseek.ChatCompletionRequest;
import liming.ai.data.deepseek.Message;
import org.json.JSONObject;

import java.io.File;
import java.io.IOException;

public class ChatCore {
    private static final DeepSeekClient client;

    static {
        try {
            client = new DeepSeekClient(new File("./config.json"));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public static String chat(String query, ChatCompletionRequest request) {
        return client.chat(query, request);
    }

    // 构建技术提示词
    public static ChatCompletionRequest buildTechPrompt() {
        ChatCompletionRequest request = new ChatCompletionRequest();
//        String systemPrompt = "作为Java专家，请按以下要求生成代码：\n" +
//                "   1. 包结构符合com.[项目].模块分层，如果未提及，则分析用户目的，合理的设置结构，如果提及了，按要求做,在未给出具体环境时，默认采用java原生开发，未给出数据库时，默认采用存放内存中\n" +
//                "   2. 包含必要的字段和Javadoc\n" +
//                "   3. 输出JSON格式：{\n" +
//                "       \"classes\": [" +
//                "           {\n" +
//                "               \"package\": \"包路径\",\n" +
//                "               \"name\": \"类名\",\n" +
//                "               \"imports\": [\"可能需要导入的包\"],\n" +
//                "               \"code\": \"大致实现思路以及注意事项\",\n" +
//                "           }" +
//                "       ]\n" +
//                "   }";
        String systemPrompt = "作为Java专家，请按以下要求生成代码：\n" +
                "   1. 包结构符合com.[项目].模块分层，如果未提及，则分析用户目的，合理的设置结构，如果提及了，按要求做,在未给出具体环境时，默认采用java原生开发，未给出数据库时，默认采用存放内存中\n" +
                "   2. 包含必要的字段和Javadoc\n" +
                "   3. 编译命令需包含：-encoding utf-8 -d 输出目录 -sourcepath 源码目录 -cp 类路径\n" +
                "      示例：javac -encoding utf-8 -d ./target/classes -sourcepath ./src/main/java -cp ./target/classes ./src/main/java/com/project/model/A.java\n" +
                "   4. 输出JSON格式：{\n" +
                "       \"classes\": [" +
                "           {\n" +
                "               \"package\": \"包路径\",\n" +
                "               \"name\": \"类名\",\n" +
                "               \"imports\": [\"可能需要导入的包\"],\n" +
                "               \"code\": \"大致实现思路以及注意事项\",\n" +
                "           }\n" +
                "       ]\n" +
                "   }"+
                "   新增要求：\n" +
                "   5. 每个类必须包含以下静态方法：\n" +
                "      - public static boolean test(): 执行基本功能测试，返回测试结果\n" +
                "      - public static <T> T construct(): 创建并返回当前类的实例\n" +
                "      示例：\n" +
                "      public static User construct() {\n" +
                "          return new User(\"default\", 18); // 根据实际情况初始化\n" +
                "      }\n" +
                "      public static boolean test() {\n" +
                "          try {\n" +
                "              User user = construct();\n" +
                "              return user != null; // 实际测试逻辑\n" +
                "          } catch (Exception e) {\n" +
                "              return false;\n" +
                "          }\n" +
                "      }";
        request.addMessage(new Message(Message.Role.SYSTEM, systemPrompt));
        return request;
    }

    // 构建问题解决提示词
    public static ChatCompletionRequest buildQueryPrompt() {
        ChatCompletionRequest request = new ChatCompletionRequest();
//        String systemPrompt = "你是一个顶级java开发工程师，请根据用户提出的问题,制定解决方法" +
//                "1. 分析当前上下文,在未给出具体环境时，默认采用java原生开发，未给出数据库时，默认采用存放内存中\n" +
//                "2. 若需要具体的上下文支持请根据用户提供的文件，有java、class、md:"+FileInfo.SOURCE_DIR+" "+FileInfo.CLASS_DIR+" "+FileInfo.DOCS_DIR+",存放的目录结构保证一致,请在files中提出，返回{\"files\":[\"路径1\",\"路径2\"]}\n" +
//                "3. 包含必要的字段和Javadoc\n" +
//                "4. 若当前已经可以通过上下文生成，并且在classes中，不需要重新生成已生成的文件（除非代码逻辑有更改），生成输出JSON格式：{\n" +
//                "       \"classes\": [" +
//                "           {\n" +
//                "               \"package\": \"包路径\",\n" +
//                "               \"name\": \"类名\",\n" +
//                "               \"imports\": [\"需要导入的路径\"],\n" +
//                "               \"code\": \"完整代码\",\n" +
//                "               \"md\": \"md格式介绍，包含当前类所有对外的api介绍\"\n" +
//                "               \"cmd\": \"编译时cmd命令,javac -encoding utf-8 开始，项目路径为 "+ Context.PROJECT_PATH +"\",\n" +
//                "           }" +
//                "       ]\n" +
//                "   }\n" +
//                "5";
        String systemPrompt = "你是一个顶级java开发工程师，请根据用户提出的问题,制定解决方法\n" +
                "1. 分析当前上下文,在未给出具体环境时，默认采用java原生开发，未给出数据库时，默认采用存放内存中\n" +
                "2. 若需要具体的上下文支持请根据用户提供的文件，有java、class、md:"+FileInfo.SOURCE_DIR+" "+FileInfo.CLASS_DIR+" "+FileInfo.DOCS_DIR+",存放的目录结构保证一致,请在files中提出，返回{\"files\":[\"路径1\",\"路径2\"]}\n" +
                "3. 包含必要的字段和Javadoc\n" +
                "4. 若当前已经可以通过上下文生成，并且在classes中，不需要重新生成已生成的文件（除非代码逻辑有更改）\n" +
                "5. 编译命令必须包含以下要素：\n" +
                "   -encoding utf-8\n" +
                "   -d 指定类文件输出目录（示例："+FileInfo.CLASS_DIR+"）\n" +
                "   -sourcepath 指定源码根目录（示例："+FileInfo.SOURCE_DIR+"）\n" +
                "   -cp 指定依赖类路径（通常与 -d 参数相同）\n" +
                "6. 生成输出JSON格式：{\n" +
                "       \"classes\": [" +
                "           {\n" +
                "               \"package\": \"包路径\",\n" +
                "               \"name\": \"类名\",\n" +
                "               \"imports\": [\"需要导入的路径\"],\n" +
                "               \"code\": \"完整代码\",\n" +
                "               \"md\": \"md格式介绍，包含当前类所有对外的api介绍\"\n" +
                "               \"cmd\": \"编译时cmd命令,javac -encoding utf-8 开始，项目路径为 "+ Context.PROJECT_PATH +"\",\n" +
                "           }\n" +
                "       ]\n" +
                "   }";
        request.addMessage(new Message(Message.Role.SYSTEM, systemPrompt));
        return request;
    }


    public static JSONObject valueToJson(String prompt) {
        return new JSONObject(prompt.substring(prompt.indexOf("{"), prompt.lastIndexOf("}") + 1));
    }
}
